package com.jichangxiu.common.properties;

import cn.hutool.core.util.StrUtil;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.io.File;

/**
 * JcxProperties:
 *
 * @author Jcx
 * @create 2023-04-03 21:49
 */
@Data
@Component
@ConfigurationProperties(prefix = "jcx")
public class JcxProperties {

    /**
     * 平台名称
     */
    private static String name = "Jcx-Boot";

    /**
     * 系统安全相关配置
     */
    private SecurityProperties securityProperties = new SecurityProperties();

    /**
     * Swagger API 文档相关配置
     */
    private SwaggerProperties swaggerProperties = new SwaggerProperties();

    /**
     * 权限相关配置
     */
    private AuthProperties authProperties = new AuthProperties();

    /**
     * 登录相关配置
     */
    private LoginProperties loginProperties = new LoginProperties();

    /**
     * 数据库相关配置
     */
    private DbProperties dbProperties = new DbProperties();

    /**
     * 文件相关配置
     */
    private FileProperties fileProperties = new FileProperties();

    /**
     * 系统安全相关配置
     */
    @Data
    public static class SecurityProperties {

        /**
         * 是否开启 XSS
         */
        private boolean xssEnabled = true;

        /**
         * 排除 XSS 的 URL 列表
         */
        private String xssExcludeUrls = "";

    }

    /**
     * Swagger API 文档相关配置
     */
    @Data
    public static class SwaggerProperties {

        /**
         * 文档标题以及分组名称
         */
        private String titleAndGroup = name;

        /**
         * 描述
         */
        private String description = "Jcx-Boot 快速开发框架 Swagger API 文档";

        /**
         * 服务器地址
         */
        private String termsOfServiceUrl = "https://www.jichangxiu.com";

        /**
         * 作者
         */
        private String contactName = "姬长修";

        /**
         * 主页
         */
        private String contactUrl = "https://www.jichangxiu.com";

        /**
         * 邮箱
         */
        private String contactEmail = "87984498@qq.com";

        /**
         * 版本
         */
        private String version = "2.0.0";

        /**
         * 开源协议
         */
        private String license = "MIT";

        /**
         * 开源协议地址
         */
        private String licenseUrl = "https://www.jichangxiu.com";

        /**
         * 受管理的包名
         */
        private String basePackage = "com.jichangxiu";

    }

    /**
     * 权限相关配置项
     */
    @Data
    public static class AuthProperties {

        /**
         * 系统初始化密码
         */
        private String initPassword = "123456";

        /**
         * 是否添加 jti 前缀
         */
        private Boolean addJtiPrefix = false;

        /**
         * 是否将 jti 写入 Response 响应头中
         */
        private Boolean writeJtiToHeader = false;

        /**
         * 请求中传过来的数据格式为 <key : value>
         * 从请求头中获取 Jti Value 的 key
         */
        private String authHeaderKey = "Authorization";

        /**
         * jti 过期时间（单位秒）默认七天
         */
        private Long authExpire = 604800L;

        /**
         * 后端发送给前端的数据格式为 <key : value>
         * 此处为 jti Value 的 Key
         */
        private String jtiToBrowserKey = "token";

        /**
         * 后端发送给前端的数据格式为 <key : value>
         * 此处为 用户信息 Value 的 Key
         */
        private String userInfoToBrowserKey = "userInfo";

        /**
         * 后端发送给前端的数据格式为 <key : value>
         * 此处为 租户信息 Value 的 Key
         */
        private String tenantInfoToBrowserKey = "tenantInfo";

        /**
         * 不需要安全认证的地址
         */
        private String noAuthPath;

        /**
         * 不需要安全认证的静态资源地址
         */
        private String noAuthStaticPath;

        public String getNoAuthPath() {
            if (StrUtil.isNotEmpty(noAuthPath)) {
                noAuthPath = noAuthPath.startsWith(",") ? noAuthPath.substring(1) : noAuthPath;
                noAuthPath = noAuthPath.endsWith(",") ? noAuthPath.substring(0, noAuthPath.length() - 1) : noAuthPath;
            }
            // 默认查询用户的方法不需要权限管理
            return "/,/index,/favicon.ico,/doc.html,/platform/captcha/**,/platform/login,/platform/logout,/druid/**,/view/**,/swagger-resources/**,/v3/**,/actuator/**" + (StrUtil.isNotEmpty(noAuthPath) ? ("," + noAuthPath) : "");
        }

        public String getNoAuthStaticPath() {
            String STATIC_SUFFIX = ".css,.js,.png,.jpg,.gif,.jpeg,.bmp,.ico,.swf,.psd,.htc,.htm,.html,.crx,.xpi,.exe,.ipa,.apk,.woff2,.ico,.swf,.ttf,.otf,.svg,.woff";
            if (StrUtil.isNotEmpty(noAuthStaticPath)) {
                noAuthStaticPath = noAuthStaticPath.startsWith(",") ? noAuthStaticPath.substring(1) : noAuthStaticPath;
                noAuthStaticPath = noAuthStaticPath.endsWith(",") ? noAuthStaticPath.substring(0, noAuthStaticPath.length() - 1) : noAuthStaticPath;
            }
            StringBuilder noAuthStatic = new StringBuilder();
            for (String staticFile : STATIC_SUFFIX.split(",")) {
                noAuthStatic.append("/*").append(staticFile).append(",").append("/**/*").append(staticFile).append(",");
            }
            String str = noAuthStatic.toString();
            if (StrUtil.isNotEmpty(str)) {
                str = str.startsWith(",") ? str.substring(1) : str;
                str = str.endsWith(",") ? str.substring(0, str.length() - 1) : str;
            }
            return str + (StrUtil.isNotEmpty(noAuthStaticPath) ? ("," + noAuthStaticPath) : "");
        }
    }

    /**
     * 登录相关配置项
     */
    @Data
    public static class LoginProperties {

        /**
         * Spring Security 登录处理地址
         */
        private String loginProcessingUrl = "/platform/login";

        /**
         * Spring Security 登出处理地址
         */
        private String logoutProcessingUrl = "/platform/logout";

        /**
         * 是否启用登录验证码
         */
        private Boolean loginCaptchaEnabled = false;

        /**
         * 后台发送给前台的验证码图片的 Key
         */
        private String toBrowserCaptchaImage = "captchaImage";

        /**
         * 前端送过来的验证码在后台 Redis 中的 Token 的 Key
         */
        private String toBrowserCaptchaKey = "captchaKey";

        /**
         * 前端送过来的租户参数 Key
         */
        private String paramTenantName = "tenantName";

        /**
         * 前端送过来的用户参数 Key
         */
        private String paramUserInfo = "userInfo";

        /**
         * 前端送过来的用户密码 Key
         */
        private String paramUserPass = "password";

        /**
         * 前端送过来的验证码 Key
         */
        private String paramCaptchaCode = "captchaCode";

        /**
         * 前端送过来的验证码在后台 Redis 中的 Token 的 Key
         */
        private String paramCaptchaKey = "captchaKey";

    }

    /**
     * 数据库相关配置项
     */
    @Data
    public static class DbProperties {

        /**
         * 不受多租户管理的表
         */
        private String noTenantTables = "";

        public String getNoTenantTables() {
            String tableName = "platform_tenant,platform_menu,platform_menu_power";
            return tableName + (noTenantTables.startsWith(",") ? noTenantTables : "," + noTenantTables);
        }

    }

    /**
     * 文件相关配置项
     */
    @Data
    public static class FileProperties {

        /**
         * 文件保存的根目录，所有文件都保存在这个目录下
         */
        public String rootFolder = File.separator + "jcx-file";

        /**
         * 请求查看文件的路径
         */
        public String actionPrefix = "view";

        /**
         * http路由前缀，用于向前台暴露文件 url
         */
        public String uploadPrefix = "upload";

        /**
         * 图片保存文件夹
         */
        public String imageFolder = "image";

        /**
         * 视频保存文件夹
         */
        public String videoFolder = "video";

        /**
         * 音频保存地址
         */
        public String audioFolder = "audio";

        /**
         * apk保存地址
         */
        public String apkFolder = "apk";

        /**
         * file保存地址 (任意类型文件)
         */
        public String fileFolder = "file";

        /**
         * 图片允许的后缀
         */
        public String imageSuffix = "jpg,jpeg,png,gif,ico,bmp,tiff,raw";

        /**
         * 视频允许的后缀
         */
        public String videoSuffix = "mp4,avi,rmvb,mov,flv";

        /**
         * 音频允许的后缀
         */
        public String audioSuffix = "mp3,aac,wav,wma,cda,flac,m4a,mid,mka,mp2,mpa,mpc,ape,ofr,ogg,ra,wv,tta,ac3,dts";

        /**
         * apk允许的后缀
         */
        public String apkSuffix = "apk";

        /**
         * file允许的后缀 (为防止上传恶意文件，这里必须手动指定可上传的类型)
         */
        public String fileSuffix = "jpg,pdf,txt,zip";

        /**
         * 件最大大小,单位/B , 此为1G
         */
        public Integer maxSize = 1024 * 1024 * 1024;

        /**
         * 本项目部署到的服务器域名（文件上传、微信支付等等模块  要用到）
         */
        public String domain = "http://127.0.0.1:9090/";

    }
}
